【Redshift】ALTER TABLEでCompound Sort Keyが変更できるようになりました!
こんにちは。DA事業本部の春田です。
Redshiftの ALTER TABLE
のオプションに、 ALTER COMPOUND SORTKEY
が追加されました!
Amazon Redshift now supports changing table sort keys dynamically
これまでソートキーを変更する際は、新規テーブルを作成して、データを移して、古いテーブルを削除するという手続きが必要でした。今回のアップデートにより、分散キーとソートキーの両方が ALTER TABLE
で変更できるようになったため、よりインタラクティブにパフォーマンスチューニングができるようになりました。
※残念ながら、 INTERLEAVED SORTKEY
はまだ対応されてません。今後のアップデートに期待ですね。
さて、気になるのは「速度的に違いはあるのか?」という点だと思います。これまでの手続きを ALTER COMPOUND SORTKEY
でラッピングしただけなのか、それとも内部処理が異なりパフォーマンスが上がっているのか、早速検証してみました。
検証
サンプルテーブルとして、ステップ 1: テストデータセットを作成する - Amazon Redshiftから customer
を使用します。クラスタはdc2.largeの2ノードを使用してます。
A
がテーブルを新規作成してデータを移す方法、 B
が ALTER TABLE ALTER SORTKEY
を使用する方法です。今回は以下の観点から比較しました。
- ソートキーなしからCOMPOUND SORTKEYへ変更
- 1カラムのCOMPOUND SORTKEYから2カラムのCOMPOUND SORTKEYへ変更
- INTERLEAVED SORTKEYからCOMPOUND SORTKEYへ変更
- COMPOUND SORTKEYとDISTSTYLEの同時変更
ソートキーなしからCOMPOUND SORTKEYへ変更
ソートキーが設定されていないテーブルに新たにソートキーを設定する時は、 ALTER TABLE
を使ったほうがかなり速い結果となりました。
CREATE TABLE customer ( c_custkey INTEGER NOT NULL, c_name VARCHAR(25) NOT NULL, c_address VARCHAR(25) NOT NULL, c_city VARCHAR(10) NOT NULL, c_nation VARCHAR(15) NOT NULL, c_region VARCHAR(12) NOT NULL, c_phone VARCHAR(15) NOT NULL, c_mktsegment VARCHAR(10) NOT NULL ); copy customer from 's3://awssampledbuswest2/ssbgz/customer' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' gzip compupdate off region 'us-west-2'; -- A -> 9.3s CREATE TABLE customer_new ( c_custkey INTEGER NOT NULL, c_name VARCHAR(25) NOT NULL, c_address VARCHAR(25) NOT NULL, c_city VARCHAR(10) NOT NULL, c_nation VARCHAR(15) NOT NULL, c_region VARCHAR(12) NOT NULL, c_phone VARCHAR(15) NOT NULL, c_mktsegment VARCHAR(10) NOT NULL ) COMPOUND SORTKEY ("c_custkey"); INSERT INTO customer_new SELECT * FROM customer; ALTER TABLE customer RENAME TO customer_old; ALTER TABLE customer_new RENAME TO customer; VACUUM customer; ANALYZE customer; -- B -> 3.5s ALTER TABLE customer_old ALTER COMPOUND SORTKEY ("c_custkey"); VACUUM customer; ANALYZE customer;
1カラムのCOMPOUND SORTKEYから2カラムのCOMPOUND SORTKEYへ変更
既存のソートキーのカラムを変更する場合は、 ALTER TABLE
を使ったほうがわずかに速い結果となりました。
CREATE TABLE customer ( c_custkey INTEGER NOT NULL, c_name VARCHAR(25) NOT NULL, c_address VARCHAR(25) NOT NULL, c_city VARCHAR(10) NOT NULL, c_nation VARCHAR(15) NOT NULL, c_region VARCHAR(12) NOT NULL, c_phone VARCHAR(15) NOT NULL, c_mktsegment VARCHAR(10) NOT NULL ) COMPOUND SORTKEY ("c_custkey"); copy customer from 's3://awssampledbuswest2/ssbgz/customer' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' gzip compupdate off region 'us-west-2'; -- A -> 4.0s CREATE TABLE customer_new ( c_custkey INTEGER NOT NULL, c_name VARCHAR(25) NOT NULL, c_address VARCHAR(25) NOT NULL, c_city VARCHAR(10) NOT NULL, c_nation VARCHAR(15) NOT NULL, c_region VARCHAR(12) NOT NULL, c_phone VARCHAR(15) NOT NULL, c_mktsegment VARCHAR(10) NOT NULL ) COMPOUND SORTKEY ("c_custkey", "c_name"); INSERT INTO customer_new SELECT * FROM customer; ALTER TABLE customer RENAME TO customer_old; ALTER TABLE customer_new RENAME TO customer; VACUUM customer; ANALYZE customer; -- B -> 3.4s ALTER TABLE customer_old ALTER COMPOUND SORTKEY ("c_custkey", "c_name"); VACUUM customer; ANALYZE customer;
INTERLEAVED SORTKEYからCOMPOUND SORTKEYへ変更
試しに INTERLEAVED SORTKEY
から COMPOUND SORTKEY
への変更を試みたのですが、 ERROR: ALTER TABLE ALTER SORTKEY cannot alter z-indexed table.
とエラーが吐き出され、変更はできませんでした。
CREATE TABLE customer ( c_custkey INTEGER NOT NULL, c_name VARCHAR(25) NOT NULL, c_address VARCHAR(25) NOT NULL, c_city VARCHAR(10) NOT NULL, c_nation VARCHAR(15) NOT NULL, c_region VARCHAR(12) NOT NULL, c_phone VARCHAR(15) NOT NULL, c_mktsegment VARCHAR(10) NOT NULL ) INTERLEAVED SORTKEY ("c_custkey", "c_name"); copy customer from 's3://awssampledbuswest2/ssbgz/customer' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' gzip compupdate off region 'us-west-2'; -- A -> 4.2s CREATE TABLE customer_new ( c_custkey INTEGER NOT NULL, c_name VARCHAR(25) NOT NULL, c_address VARCHAR(25) NOT NULL, c_city VARCHAR(10) NOT NULL, c_nation VARCHAR(15) NOT NULL, c_region VARCHAR(12) NOT NULL, c_phone VARCHAR(15) NOT NULL, c_mktsegment VARCHAR(10) NOT NULL ) COMPOUND SORTKEY ("c_custkey", "c_name"); INSERT INTO customer_new SELECT * FROM customer; ALTER TABLE customer RENAME TO customer_old; ALTER TABLE customer_new RENAME TO customer; VACUUM customer; ANALYZE customer; -- B -> ERROR: ALTER TABLE ALTER SORTKEY cannot alter z-indexed table. ALTER TABLE customer_old ALTER COMPOUND SORTKEY ("c_custkey", "c_name"); VACUUM customer; ANALYZE customer;
COMPOUND SORTKEYとDISTSTYLEの変更
分散キーとソートキーを同時に変更する時は、新しくテーブルを作成した方が良さそうですね。
CREATE TABLE customer ( c_custkey INTEGER NOT NULL, c_name VARCHAR(25) NOT NULL, c_address VARCHAR(25) NOT NULL, c_city VARCHAR(10) NOT NULL, c_nation VARCHAR(15) NOT NULL, c_region VARCHAR(12) NOT NULL, c_phone VARCHAR(15) NOT NULL, c_mktsegment VARCHAR(10) NOT NULL ) DISTSTYLE KEY DISTKEY ("c_custkey") COMPOUND SORTKEY ("c_custkey"); copy customer from 's3://awssampledbuswest2/ssbgz/customer' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' gzip compupdate off region 'us-west-2'; -- A -> 15.0s CREATE TABLE customer_new ( c_custkey INTEGER NOT NULL, c_name VARCHAR(25) NOT NULL, c_address VARCHAR(25) NOT NULL, c_city VARCHAR(10) NOT NULL, c_nation VARCHAR(15) NOT NULL, c_region VARCHAR(12) NOT NULL, c_phone VARCHAR(15) NOT NULL, c_mktsegment VARCHAR(10) NOT NULL ) DISTSTYLE KEY DISTKEY ("c_name") SORTKEY ("c_name"); INSERT INTO customer_new SELECT * FROM customer; ALTER TABLE customer RENAME TO customer_old; ALTER TABLE customer_new RENAME TO customer; VACUUM customer; ANALYZE customer; -- B -> 24.2s ALTER TABLE customer_old ALTER DISTKEY "c_name"; ALTER TABLE customer_old ALTER COMPOUND SORTKEY ("c_name") ; VACUUM customer; ANALYZE customer;
まとめ
2019年11月9日現在の特徴は以下の通りです。
ALTER SORTKEY
は ソートキーなし と COMPOUND SORTKEY のテーブルにしか使えない- テーブルを新規作成してデータを移す今までのやり方より、
ALTER SORTKEY
の方が速そう - ただし、分散キーも合わせて変更する場合は、テーブルを新規作成してデータを移すやり方の方が速い
ご参考になれば幸いです。